#include <iostream>
using namespace std;

template<typename T>
const T& mymax(const T& a, const T& b)
{
    cout << __PRETTY_FUNCTION__ << endl;
    return (a < b) ? b : a;
}

template<typename T>
const T* mymax2(const T* a, const T* b)
{
    cout << __PRETTY_FUNCTION__ << endl;
    return (a < b) ? b : a;
}

template<typename T>
void test_func(T f)
{
    cout << __PRETTY_FUNCTION__ << endl;
}

int f1(int a, int b)
{
    return 0;
}

int main() {
    char a[] = "ab";
    char b[] = "cd";
    mymax(a, b);
    mymax2(a, b);

//    char a1[] = "abc";
//    char b1[] = "cd";
//    mymax(a1, b1);
//    mymax2(a1, b1);

    test_func(f1);
    test_func(&f1);

    return 0;
}
